package com.dashanchessgame.chess;

import com.dashanchessgame.tools.WinUtils;
import com.dashanchessgame.tools.ImageTool;

import java.awt.*;

/**
 * 炮
 *
 * @author 37460
 */

public class ChessCannon implements Chess {
    /**
     * chessCheck  检查落子是否合法
     * <p>
     * map              地图
     * nowLineNumber   当前棋子的行号
     * nowColumnNumber 当前棋子的列号
     * toLineNumber    棋子要去的行号
     * toColumnNumber  棋子要去的列号
     * isChessColor     判断棋子的攻守方  黑的返回true 红的返回false
     * 如果可以去，返回true, 否则返回false
     */
    @Override
    public boolean chessCheck(int[][] map, int nowLineNumber, int nowColumnNumber, int toLineNumber, int toColumnNumber, boolean isChessColor) {
        int istoLineNumber = Math.abs(toLineNumber - nowLineNumber);   //计算出相差的行号值
        int istoColumnNumber = Math.abs(toColumnNumber - nowColumnNumber); //计算出相差的列号值
//        判断是不是走直线
        if (!((istoLineNumber != 0 && istoColumnNumber == 0) || (istoLineNumber == 0 && istoColumnNumber != 0))) {
            return false;//如果不是返回false
        }
        //判断棋子行走路径上有没有棋子
        int count = 0;
        int from, to;
        //目标点没有棋子且目标点和起始点之间没有棋子，则成功移动
        //目标点有棋子，且为敌方棋子，且目标点和初始点之间有一个棋子，成功。
        if (istoLineNumber == 0) {  //横着像右
            if (nowColumnNumber < toColumnNumber) { //向左走
                //
                from = nowColumnNumber + 1;
                to = toColumnNumber;
            } else {//横着走向右
                from = toColumnNumber + 1;
                to = nowColumnNumber;
            }
            //循环遍历数组查询路径上是否由其子一直到，有的话count++
            for (int i = from; i < to; i++) {
                if (map[nowLineNumber][i] != 0) {
                    count++;
                }
            }
            //判断count如果是0则线路上没有棋子，如果是
            if (map[toLineNumber][toColumnNumber] == 0 && count == 0) {
                System.out.println("行走路径上没有棋子");
                return true;
            }
            if (map[toLineNumber][toColumnNumber] == 0 && count == 1) {
                System.out.println("要去的坐标为上没有棋子不能跳过去");
                return false;
            }
            //黑方，对面为红方;  红方，对面为黑方。 1000作为判断红黑双方的凭着具体详细见 CanvasChess中的map数据
            if ((map[toLineNumber][toColumnNumber] != 0 && ((isChessColor && map[toLineNumber][toColumnNumber] < 1000)) || ((!isChessColor && map[toLineNumber][toColumnNumber] > 1000)) && count == 1)) {
                //将军
                return WinUtils.win(map,toLineNumber,toColumnNumber,isChessColor);
                //否则返回true
            } else {
                return false;
            }
        } else { //竖着走
            //判断走向如果现在行数小于要去的行数就是向下走，反之向上
            if (nowLineNumber < toLineNumber) {
                from = nowLineNumber + 1;
                to = toLineNumber;
            } else {
                from = toLineNumber + 1;
                to = nowLineNumber;
            }
            for (int i = from; i < to; i++) {
                if (map[i][nowColumnNumber] != 0) {
                    System.out.println(map[i][nowColumnNumber]);
                    count++;
                }
            }
            //如果map[toLineNumber][toLineNumber]==0 count为0表示中间路径上面没有一个棋子该位置上没有一个棋子
            if (map[toLineNumber][toColumnNumber] == 0 && count == 0) {
                return true;
            }
            //如果map[toLineNumber][toLineNumber]==0 count为1表示中间路径上面有一个棋子可以作为跳板进行打击map[toLineNumber][toLineNumber]
            if (map[toLineNumber][toColumnNumber] != 0 && count == 1 ) {
                return WinUtils.win(map,toLineNumber,toColumnNumber,isChessColor);
            }
        return false;
        }
    }
//方法

    @Override
    public int getType() {
        return 'P';
    }

    @Override
    public Image getImage(boolean isChessColor) {

        return ImageTool.loadImage(isChessColor ? "黑炮.gif" : "红炮.gif");
    }
}
